package com.mojawa.mj_amap.util

import android.graphics.Color
import com.amap.api.maps.AMap
import com.amap.api.maps.CameraUpdateFactory
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.LatLngBounds
import com.amap.api.maps.model.MarkerOptions
import com.amap.api.maps.model.MyLocationStyle
import com.amap.api.maps.model.Polyline
import com.amap.api.maps.model.PolylineOptions
import com.mojawa.mj_util.anima.LineDrawingAnimator
import java.util.ArrayList


/**
 * 高德地图工具类
 */
object MJMapViewUtil {
    /**
     * 夜间模式--地图
     */
    fun showNight(aMap: AMap?){
        //夜景地图，aMap是地图控制器对象
        aMap?.mapType = AMap.MAP_TYPE_NIGHT
    }
    /**
     * 地图切换语言 -- 中英文
     * 默认中文
     * 英文 -- en
     */
    fun showMapLanguage(aMap:AMap?,language:String){
        aMap?.setMapLanguage(language)
    }

    /**
     * 当前位置在屏幕正中间
     */
    fun locationCenter(aMap: AMap?,latLng: LatLng,width: Float = 15f){
        aMap?.let {
            // 将当前位置设置为地图的中心
            val cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, width)
            aMap.animateCamera(cameraUpdate)
        }
    }
    /**
     * 初始化地图视角
     */

    fun locationScope(aMap: AMap?,width: Float = 17f){
        aMap?.let {
            it.moveCamera(CameraUpdateFactory.zoomTo(width))
        }
    }
    /**
     * 把线放在屏幕中间
     */
    private fun centerPolyline(aMap: AMap?,points: List<LatLng>, useAnimation: Boolean = true) {
        if (points.isEmpty()) return

        // 构建 LatLngBounds 包含所有线的点
        val builder = LatLngBounds.Builder()
        for (point in points) {
            builder.include(point)
        }
        val bounds = builder.build()

        // 将地图移动到这些点的区域，并设置合适的缩放级别
        val padding = 100  // 视图中的边距，可以调整以获得适合的显示
        // 判断是否使用动画移动地图到线条中心
        if (useAnimation) {
            aMap?.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, padding))
        } else {
            aMap?.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, padding))
        }
    }

    /**
     * 结束时候调用
     * 设置开始结束图标
     */
    fun showMarkerOptions(latLng: List<LatLng>?,aMap: AMap?){
        if (latLng.isNullOrEmpty() ) return
        val startMarkerOption = MarkerOptions()
        startMarkerOption.position(latLng?.get(0))
        //设置图标 -- 根据实际要求进行更改
//        startMarkerOption.icon(
//            BitmapDescriptorFactory.fromBitmap(
//                BitmapFactory
//                    .decodeResource(getResources(), R.drawable.location_marker)
//            )
//        )
        // 将Marker设置为贴地显示，可以双指下拉地图查看效果
        //设置marker平贴地图效果 startMarkerOption.setFlat(true)
        //添加到地图上
        aMap?.addMarker(startMarkerOption)
        val endMarkerOption = MarkerOptions()
        endMarkerOption.position(latLng?.get(latLng.size-1))
        //设置图标 -- 根据实际要求进行更改
//        endMarkerOption.icon(
//            BitmapDescriptorFactory.fromBitmap(
//                BitmapFactory
//                    .decodeResource(getResources(), R.drawable.location_marker)
//            )
//        )
        aMap?.addMarker(endMarkerOption)
    }

    /**
     * 设置系统蓝点
     */
    fun systemBlueDot(myLocationStyle: MyLocationStyle?,aMap: AMap?){
        myLocationStyle?.apply {
            myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE) // 设置连续定位且会跟随手机移动
            interval(1000) // 定位间隔，2秒更新一次
        }

        // 设置蓝点样式到地图
        aMap?.myLocationStyle = myLocationStyle
        aMap?.isMyLocationEnabled = true // 启用蓝点

        // 启用定位按钮（可以显示定位按钮在地图上）
        aMap?.uiSettings?.isMyLocationButtonEnabled = true

    }

    /**
     * 高德划线
     *
     * 传入一个集合
     * true为一下子画全部
     * false为增加一个点画一个点 默认false
     *
     */
    fun showLines(aMap: AMap?,points: List<LatLng>? ,add: Boolean = false,width: Float = 20f) : Polyline?{
        if (add){
            aMap?.clear()
            if (points != null) {
                centerPolyline(aMap,points)
            }
            return aMap?.addPolyline(PolylineOptions().addAll(points).width(width).color(Color.argb(255, 255, 0,0)))
        }else{
            val polylineOptions = PolylineOptions()
                .width(width)                      // 设置线条宽度
                .color(Color.argb(255, 255, 0, 0)) // 设置颜色为红色

            // 逐个添加点
            if (points != null) {
                for (point in points) {
                    polylineOptions.add(point)
                }
                centerPolyline(aMap,points)
            }
            // 在地图上绘制线条
            return aMap?.addPolyline(polylineOptions)
        }

    }

    /**
     * 地图轨迹回放功能
     * 默认宽度 20f
     * 5s执行完毕
     */
    fun drawAnimatedPolyline(aMap: AMap, points: List<LatLng>, width: Float = 20f, duration: Long = 5000L) {
        // 清除地图上的所有内容
//        aMap?.clear()
        centerPolyline(aMap,points)
        // 创建一个空的Polyline
        val polylineOptions = PolylineOptions()
            .width(width)
            .color(Color.BLUE)

        // 添加Polyline到地图上
        val polyline = aMap.addPolyline(polylineOptions)

        // 启动逐帧动画
        val lineAnimator = LineDrawingAnimator(duration) { fraction ->
            // 动画的进度在 fraction 参数中传入
            val pointsToShow = (points.size  * fraction).toInt()
            val subList = points.subList(0, pointsToShow.coerceAtMost(points.size))

            // 更新Polyline的点，确保逐步添加
            polyline?.points = subList
        }
        lineAnimator.start()

    }

    fun convertToAMapLatLng(myAmapLatLngList: ArrayList<LatLng>): List<LatLng> {
        return myAmapLatLngList.map { MyLatLng ->
            LatLng(MyLatLng.latitude, MyLatLng.longitude)
        }
    }



}